package Model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
@Table(name = "pedidoempresa", uniqueConstraints = @UniqueConstraint(columnNames = {"data_entrega", "cod_empresa"}))
@SuppressWarnings("serial")
public class PedidoEmpresaVO implements Serializable {

   @Id
   @SequenceGenerator(name = "cod_pedido_empresa", sequenceName = "cod_pedido_empresa_seq", allocationSize = 1)
   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "cod_pedido_empresa")
   @Column(name = "cod_pedido_empresa", insertable = false)
   private int codPedidoEmpresa;
   
   @ManyToOne(fetch = FetchType.EAGER)
   @JoinColumn(name = "cod_empresa")
   @Cascade(CascadeType.LOCK)
   private Empresa empresa;

   @Temporal(TemporalType.DATE)
   @Column(name = "data_entrega")
   private Date dataEntrega;

   @Column(name = "valor_total")
   private double valorTotal;

   //eager faz com que quando se faz uma consulta por pedido empresa, os itens sejam carregados automaticamente
   @OneToMany(fetch = FetchType.EAGER, mappedBy = "pedidoEmpresa", cascade = {javax.persistence.CascadeType.MERGE, javax.persistence.CascadeType.REMOVE, javax.persistence.CascadeType.PERSIST})
   //select faz com que na consulta liste-se somentes os pedidos como one-to-many e naum como one-to-one para items
   @Fetch(FetchMode.SELECT)
   @Cascade(CascadeType.LOCK)
   private Collection<ItemPedidoEmpresa> itemPedidoEmpresa;

   //Construtores
   //Construtor padrao
   public PedidoEmpresaVO() {
      this.empresa = new Empresa();
      this.dataEntrega = new Date();
      itemPedidoEmpresa = new ArrayList<ItemPedidoEmpresa>();
      codPedidoEmpresa = 0;
   }

   //Construtor com parametros
   public PedidoEmpresaVO(int codPedidoEmpresa, Collection<ItemPedidoAssociado> itemPedidoAssociado, Empresa empresa, Date dataPedido, Date dataPrevisaoEntrega, double valorTotal, Collection<Produto> produto) {
      this.codPedidoEmpresa = codPedidoEmpresa;
      this.empresa = empresa;
      this.dataEntrega = dataPrevisaoEntrega;
      this.valorTotal = valorTotal;
   }

   //Metodos Get e Set
   public int getCodPedidoEmpresa() {
      return codPedidoEmpresa;
   }

   public void setCodPedidoEmpresa(int codPedidoEmpresa) {
      this.codPedidoEmpresa = codPedidoEmpresa;
   }

   public Empresa getEmpresa() {
      return empresa;
   }

   public void setEmpresa(Empresa empresa) {
      this.empresa = empresa;
   }

   public double getValorTotal() {
       valorTotal=0;
      List<ItemPedidoEmpresa> itensPedido = (List<ItemPedidoEmpresa>)itemPedidoEmpresa;
     for(int i=0; i<itensPedido.size(); i++){
         valorTotal += itensPedido.get(i).getValorTotal();
      }
      return valorTotal;
   }

   public void setValorTotal(double valorTotal) {
      this.valorTotal = valorTotal;
   }

   public Date getDataEntrega() {
      return dataEntrega;
   }

   public void setDataEntrega(Date dataEntrega) {
      this.dataEntrega = dataEntrega;
   }

   public Collection<ItemPedidoEmpresa> getItemPedidoEmpresa() {
      return itemPedidoEmpresa;
   }

   public void setItemPedidoEmpresa(Collection<ItemPedidoEmpresa> itemPedidoEmpresa) {
      this.itemPedidoEmpresa = itemPedidoEmpresa;
   }

   public void adicionaItemPedido(ItemPedidoEmpresa item) {
      boolean contem = false;
      if (itemPedidoEmpresa.isEmpty()) {
         itemPedidoEmpresa.add(item);
      } else {
         List<ItemPedidoEmpresa> itemPed = (List<ItemPedidoEmpresa>) itemPedidoEmpresa;
         for (int i = 0; i < itemPed.size(); i++) {
            if ((itemPed.get(i).getProduto().getCodProduto() == item.getProduto().getCodProduto()) &&
                    (itemPed.get(i).getPedidoEmpresa().getEmpresa().getCodEmpresa() == item.getPedidoEmpresa().getEmpresa().getCodEmpresa())) {

               item.setCodItemPedidoEmpresa(itemPed.get(i).getCodItemPedidoEmpresa());
               itemPed.remove(i);
               itemPed.add(i, item);
               contem = true;
            }
         }
         if (!contem) {
            itemPed.add(item);
         }
         setItemPedidoEmpresa(itemPed);
      }
   }

   //retorna lista de pedido associado a partir de pedido empresa
   public List<ItemPedidoAssociado> itemPedidoAssociado() {
      List<ItemPedidoAssociado> itemAss = new ArrayList<ItemPedidoAssociado>();
      itemAss.clear();
      List<ItemPedidoEmpresa> item = (List<ItemPedidoEmpresa>) itemPedidoEmpresa;
      for (int i = 0; i < itemPedidoEmpresa.size(); i++) {
         if (!item.get(i).getItemPedidoAssociado().isEmpty()) {
            itemAss.addAll(item.get(i).getItemPedidoAssociado());
         }
      }
      return itemAss;
   }
   //retorna lista de itensVenda a partir de pedido empresa
   public List<Venda> itemVenda() {
      List<Venda> itemVenda = new ArrayList<Venda>();
      List<ItemPedidoAssociado> item = itemPedidoAssociado();
      for (int i = 0; i < item.size(); i++) {
         if (item.get(i).getVenda() != null) {
            itemVenda.add(item.get(i).getVenda());
         }
      }
      return itemVenda;
   }
   public void setItemPedidoAssociado(List<ItemPedidoAssociado> lista){
       itemPedidoAssociado().clear();
       for(int i=0;i<lista.size();i++){
           itemPedidoAssociado().add(lista.get(i));
       }
   }

   public double getTotalVenda() {

      List<Venda> itensVenda = itemVenda();
      if (itemVenda() != null) {
         double total = 0.00;
         while (itensVenda.iterator().hasNext()) {
            total += itensVenda.iterator().next().getValorTotal();
            itensVenda.remove(itensVenda.iterator().next());
         }
         return total;
      }
      return 0.00;
   }

   public double getTotalPedido() {
      List<ItemPedidoEmpresa> itensPedido = (List<ItemPedidoEmpresa>) getItemPedidoEmpresa();
      double total = 0.00;
      while (itensPedido.iterator().hasNext()) {
         total += itensPedido.iterator().next().getValorTotal();
         System.out.println(itensPedido.iterator().next().getValorTotal());
         itensPedido.remove(itensPedido.iterator().next());
      }
      return total;
   }

   public double getTotalComissao() {
      List<Venda> itensVenda = itemVenda();
      double total = 0.00;
      while (itensVenda.iterator().hasNext()) {
         total += itensVenda.iterator().next().getComissao();
         itensVenda.remove(itensVenda.iterator().next());
      }
      return total;

   }
   @Transient
   private double totalComissao;
   @Transient
   private double totalVenda;

   public void setTotalComissao(double totalComissao) {
      this.totalComissao = totalComissao;
   }

   public void setTotalVenda(double totalVenda) {
      this.totalVenda = totalVenda;
   }
}